package showgo.gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.DefaultListModel;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import showgo.modell.Manager;
import showgo.modell.stamm.Ensemble;
import showgo.modell.stamm.Person;

/**
 * GUI fuer die Verwaltung von Ensemble
 * 
 * @author lutz
 * 
 */
public class EnsembleDialog extends JDialog implements ActionListener,
	KeyListener, MouseListener, ListSelectionListener {

    /**
     * 
     */
    private static final long serialVersionUID = -1103390178630487050L;

    private Ensemble ensemble;

    private String alteBezeichnung;

    private javax.swing.JButton abbrechenButton;
    private javax.swing.JButton beendenButton;
    private javax.swing.JLabel darstellerLabel;
    private javax.swing.JLabel darstellerLabel1;
    @SuppressWarnings("rawtypes")
    private JList darstellerList;
    private javax.swing.JLabel hinweisLabel;
    private javax.swing.JLabel hinweisLabel1;
    private javax.swing.JLabel inszenLabel;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JTextField nameTextField;
    private javax.swing.JLabel personenLabel;
    @SuppressWarnings("rawtypes")
    private JList personenList;
    private javax.swing.JLabel titelLabel;

    public EnsembleDialog(Ensemble ensemble) {
	this.alteBezeichnung = new String(ensemble.getName());
	this.ensemble = ensemble;

	initComponents();
	fuelleListen();
    }

    @SuppressWarnings("rawtypes")
    private void initComponents() {

	setPreferredSize(new java.awt.Dimension(650, 300));
	// DialogFrame kann nicht maximiert werden
	setResizable(false);

	titelLabel = new javax.swing.JLabel();
	titelLabel.setFont(new java.awt.Font("Tahoma", 1, 16));
	titelLabel.setText("Ensemble - Bearbeitung");

	nameTextField = new javax.swing.JTextField();
	nameTextField.setText(alteBezeichnung);

	jScrollPane3 = new javax.swing.JScrollPane();
	darstellerList = new JList();
	darstellerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	darstellerList.addKeyListener(this);
	darstellerList.addListSelectionListener(this);
	jScrollPane3.setViewportView(darstellerList);

	darstellerLabel = new javax.swing.JLabel();
	darstellerLabel.setFont(new java.awt.Font("Tahoma", 1, 14));
	darstellerLabel.setText("Darsteller im Ensemble");

	darstellerLabel1 = new javax.swing.JLabel();
	darstellerLabel1.setFont(new java.awt.Font("Tahoma", 1, 14));
	darstellerLabel1.setText("Bezeichnung");

	abbrechenButton = new javax.swing.JButton();
	abbrechenButton.setFont(new java.awt.Font("Tahoma", 1, 12));
	abbrechenButton.setText("Abbrechen");
	abbrechenButton.addActionListener(this);

	beendenButton = new javax.swing.JButton();
	beendenButton.setFont(new java.awt.Font("Tahoma", 1, 12));
	beendenButton.setText("Beenden");
	beendenButton.addActionListener(this);

	personenLabel = new javax.swing.JLabel();
	personenLabel.setFont(new java.awt.Font("Tahoma", 1, 14));
	personenLabel.setText("weitere Personen");

	jScrollPane4 = new javax.swing.JScrollPane();
	personenList = new JList();
	personenList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	personenList.addMouseListener(this);
	jScrollPane4.setViewportView(personenList);

	hinweisLabel = new javax.swing.JLabel();
	hinweisLabel1 = new javax.swing.JLabel();
	hinweisLabel.setFont(new java.awt.Font("Tahoma", 3, 11));
	hinweisLabel.setText("(Darsteller mit \"Entf\" löschen. )");
	hinweisLabel1.setFont(new java.awt.Font("Tahoma", 3, 11));
	hinweisLabel1.setText("(Personen mit Doppelklick hinzufügen. )");

	inszenLabel = new javax.swing.JLabel();
	inszenLabel.setText(getInszenierung());
	inszenLabel.setToolTipText(getInszenierung());

	javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
		getContentPane());
	getContentPane().setLayout(layout);
	layout.setHorizontalGroup(layout
		.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
		.addGroup(
			layout.createSequentialGroup()
				.addContainerGap()
				.addGroup(
					layout.createParallelGroup(
						javax.swing.GroupLayout.Alignment.LEADING)
						.addComponent(
							darstellerLabel1,
							javax.swing.GroupLayout.DEFAULT_SIZE,
							javax.swing.GroupLayout.DEFAULT_SIZE,
							Short.MAX_VALUE)
						.addComponent(titelLabel)
						.addGroup(
							layout.createSequentialGroup()
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.LEADING,
										false)
										.addComponent(
											nameTextField)
										.addComponent(
											inszenLabel,
											javax.swing.GroupLayout.PREFERRED_SIZE,
											120,
											Short.MAX_VALUE))
								.addPreferredGap(
									javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.LEADING)
										.addGroup(
											layout.createSequentialGroup()
												.addComponent(
													darstellerLabel)
												.addGap(18,
													18,
													18)
												.addComponent(
													personenLabel)
												.addGap(0,
													0,
													Short.MAX_VALUE))
										.addGroup(
											layout.createSequentialGroup()
												.addGroup(
													layout.createParallelGroup(
														javax.swing.GroupLayout.Alignment.LEADING)
														.addGroup(
															layout.createSequentialGroup()
																.addComponent(
																	jScrollPane3,
																	javax.swing.GroupLayout.PREFERRED_SIZE,
																	155,
																	javax.swing.GroupLayout.PREFERRED_SIZE)
																.addGap(18,
																	18,
																	18)
																.addComponent(
																	jScrollPane4,
																	javax.swing.GroupLayout.PREFERRED_SIZE,
																	152,
																	javax.swing.GroupLayout.PREFERRED_SIZE))
														.addComponent(
															hinweisLabel)
														.addComponent(
															hinweisLabel1))
												.addPreferredGap(
													javax.swing.LayoutStyle.ComponentPlacement.RELATED,
													javax.swing.GroupLayout.DEFAULT_SIZE,
													Short.MAX_VALUE)
												.addComponent(
													abbrechenButton,
													javax.swing.GroupLayout.PREFERRED_SIZE,
													155,
													javax.swing.GroupLayout.PREFERRED_SIZE)))))
				.addContainerGap())
		.addGroup(
			layout.createSequentialGroup()
				.addGap(483, 483, 483)
				.addComponent(beendenButton,
					javax.swing.GroupLayout.PREFERRED_SIZE,
					155,
					javax.swing.GroupLayout.PREFERRED_SIZE)
				.addContainerGap(
					javax.swing.GroupLayout.DEFAULT_SIZE,
					Short.MAX_VALUE)));
	layout.setVerticalGroup(layout
		.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
		.addGroup(
			layout.createSequentialGroup()
				.addContainerGap()
				.addComponent(titelLabel)
				.addPreferredGap(
					javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
				.addGroup(
					layout.createParallelGroup(
						javax.swing.GroupLayout.Alignment.BASELINE)
						.addComponent(
							darstellerLabel1,
							javax.swing.GroupLayout.PREFERRED_SIZE,
							26,
							javax.swing.GroupLayout.PREFERRED_SIZE)
						.addComponent(
							darstellerLabel,
							javax.swing.GroupLayout.PREFERRED_SIZE,
							26,
							javax.swing.GroupLayout.PREFERRED_SIZE)
						.addComponent(
							personenLabel,
							javax.swing.GroupLayout.PREFERRED_SIZE,
							26,
							javax.swing.GroupLayout.PREFERRED_SIZE))
				.addPreferredGap(
					javax.swing.LayoutStyle.ComponentPlacement.RELATED)
				.addGroup(
					layout.createParallelGroup(
						javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
							layout.createSequentialGroup()
								.addGap(0,
									0,
									Short.MAX_VALUE)
								.addComponent(
									abbrechenButton,
									javax.swing.GroupLayout.PREFERRED_SIZE,
									43,
									javax.swing.GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(
									javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
								.addComponent(
									beendenButton,
									javax.swing.GroupLayout.PREFERRED_SIZE,
									43,
									javax.swing.GroupLayout.PREFERRED_SIZE))
						.addGroup(
							layout.createSequentialGroup()
								.addGroup(
									layout.createParallelGroup(
										javax.swing.GroupLayout.Alignment.LEADING)
										.addGroup(
											layout.createSequentialGroup()
												.addComponent(
													nameTextField,
													javax.swing.GroupLayout.PREFERRED_SIZE,
													javax.swing.GroupLayout.DEFAULT_SIZE,
													javax.swing.GroupLayout.PREFERRED_SIZE)
												.addPreferredGap(
													javax.swing.LayoutStyle.ComponentPlacement.RELATED)
												.addComponent(
													inszenLabel))
										.addGroup(
											layout.createSequentialGroup()
												.addGroup(
													layout.createParallelGroup(
														javax.swing.GroupLayout.Alignment.LEADING)
														.addComponent(
															jScrollPane4,
															javax.swing.GroupLayout.PREFERRED_SIZE,
															146,
															javax.swing.GroupLayout.PREFERRED_SIZE)
														.addComponent(
															jScrollPane3,
															javax.swing.GroupLayout.PREFERRED_SIZE,
															146,
															javax.swing.GroupLayout.PREFERRED_SIZE))
												.addPreferredGap(
													javax.swing.LayoutStyle.ComponentPlacement.RELATED)
												.addComponent(
													hinweisLabel)))
								.addPreferredGap(
									javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(
									hinweisLabel1)
								.addGap(0,
									29,
									Short.MAX_VALUE)))
				.addContainerGap()));

	pack();
    }

    /**
     * Anzeige der Inszenierung, in der dieses Ensemble enthalten ist
     * 
     */
    private String getInszenierung() {
	String titel = "";
	if (!Manager.getInstance().getInszenierungen().isEmpty()) {
	    if (Manager.getInstance().ensembleWirdVerwendet(ensemble)) {
		for (int i = 0; i < Manager.getInstance().getInszenierungen()
			.size(); i++) {
		    if (Manager.getInstance().getInszenierungen().get(i)
			    .getEnsemble().getName().equals(ensemble.getName())) {
			titel = Manager.getInstance().getInszenierungen()
				.get(i).getInszBezeichnung();
		    }
		}
	    }
	}
	return titel;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
	if (e.getClickCount() == 2) {
	    // beim Doppelklick in die Liste der Personen wird die
	    // gewaehlte Person in das Ensemble geladen:
	    if (e.getSource() == personenList) {
		int index = personenList.locationToIndex(e.getPoint());
		String name = personenList.getModel().getElementAt(index)
			.toString();
		for (int i = 0; i < Manager.getInstance().getPersonen().size(); i++) {
		    if (Manager.getInstance().getPersonen().get(i).getName()
			    .equals(name)) {
			Person neuerDarsteller = Manager.getInstance()
				.getPersonen().get(i);
			ensemble.getGruppe().add(neuerDarsteller);
		    }
		}
		fuelleListen();
	    }
	}
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {

    }

    @Override
    public void mouseExited(MouseEvent arg0) {

    }

    @Override
    public void mousePressed(MouseEvent arg0) {

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
	if (e.getSource() == darstellerList) {
	    // Entfernen der gewaehlten Person aus dem Ensemble:
	    if (e.getKeyCode() == KeyEvent.VK_DELETE) {
		int ret = JOptionPane
			.showConfirmDialog(
				null,
				"Wollen Sie diesen Darsteller aus dem Ensemble entfernen?",
				"Warnung", JOptionPane.YES_NO_OPTION,
				JOptionPane.QUESTION_MESSAGE);
		if (ret == JOptionPane.OK_OPTION) {
		    int index = darstellerList.getSelectedIndex();
		    ensemble.getGruppe().remove(index);
		    fuelleListen();
		}
	    }
	}

    }

    @Override
    public void keyReleased(KeyEvent arg0) {

    }

    @Override
    public void keyTyped(KeyEvent arg0) {

    }

    @Override
    public void actionPerformed(ActionEvent e) {
	if (e.getSource() == abbrechenButton) {
	    int ret = JOptionPane.showConfirmDialog(null,
		    "Wollen Sie die Aenderungen verwerfen?",
		    "Sitzung Abbrechen!", JOptionPane.YES_NO_OPTION);
	    if (ret == JOptionPane.YES_OPTION) {
		dispose();
	    }
	} else if (e.getSource() == beendenButton) {
	    if (!nameTextField.getText().isEmpty()) {

		// uebergebenes Ensemble entfernen, wenn es kein Neues war
		if (!alteBezeichnung.equals("neues Ensemble")) {
		    for (int i = 0; i < Manager.getInstance().getEnsembles()
			    .size(); i++) {
			if (Manager.getInstance().getEnsembles().get(i)
				.getName().equals(alteBezeichnung)) {
			    Manager.getInstance().getEnsembles().remove(i);
			}
		    }
		}

		// geaendertes Ensemble hinzufuegen
		ensemble.setName(nameTextField.getText());
		Manager.getInstance().fuegeEnsembleHinzu(ensemble);
		Manager.getInstance().fireListChanged();
		dispose();
	    } else {
		JOptionPane.showMessageDialog(null,
			"Bitte eine Bezeichnung für das Ensemble eingeben!");
		nameTextField.requestFocusInWindow();
	    }
	}
    }

    /**
     * Diese Methode stellt alle Personen in der Liste des Ensembles dar, die
     * auch zum Ensemble gehoeren; Alle anderen Personen werden in der
     * Personenliste angezeigt;
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void fuelleListen() {
	DefaultListModel personDaten = new DefaultListModel();
	DefaultListModel darstellerDaten = new DefaultListModel();

	if (Manager.getInstance().getPersonen().isEmpty()) {
	    // dann nur die Darsteller-Liste fuellen
	    if (!ensemble.getGruppe().isEmpty()) {
		for (int i = 0; i < ensemble.getGruppe().size(); i++) {
		    darstellerDaten.add(i, ensemble.getGruppe().get(i)
			    .getName());
		}
	    }
	} else if (ensemble.getGruppe().isEmpty()) {
	    // dann nur die Personen anzeigen, ohne Bedingungen
	    for (int i = 0; i < Manager.getInstance().getPersonen().size(); i++) {
		personDaten.add(i, Manager.getInstance().getPersonen().get(i)
			.getName());
	    }
	} else {
	    // Darsteller laden
	    for (int i = 0; i < ensemble.getGruppe().size(); i++) {
		darstellerDaten.add(i, ensemble.getGruppe().get(i).getName());
	    }
	    // Hilfs- List erzeugen
	    List<Person> neu = new ArrayList<Person>();
	    for (int i = 0; i < Manager.getInstance().getPersonen().size(); i++) {
		neu.add(Manager.getInstance().getPersonen().get(i));
	    }
	    // Vergleich, damit eine Personen nicht in beiden Listen angezeigt
	    // werden
	    for (int i = 0; i < neu.size(); i++) {
		for (int j = 0; j < ensemble.getGruppe().size(); j++) {
		    if (ensemble.getGruppe().get(j).getName()
			    .equals(neu.get(i).getName())) {
			neu.remove(i);
			i = 0;
		    }
		}
	    }
	    // Laden der restlichen Personen
	    for (int i = 0; i < neu.size(); i++) {
		personDaten.add(i, neu.get(i).getName());
	    }
	}

	darstellerList.setModel(darstellerDaten);
	personenList.setModel(personDaten);
    }

    @Override
    public void valueChanged(ListSelectionEvent e) {

    }

}
